/* 
泛型接口
*/

 /* 
  1. 声明泛型类型: 在接口名的右侧  <T>   // T K V
  2. 使用泛型: 接口体中
  3. 指定泛型的具体类型: 定义实现时, 接口名的右侧 <具体类型>
  */
  interface BaseCRUD<T> {
    data: T[]; // 包含所有添加的数据项的数组
    add (t: T): number; // 添加一个数据项, 返回生成的id
    getById(id: number): T; // 得到指定id对应的数据项
  }

  class User {
    id?: number
    name: string
    age: number
    constructor (name: string, age: number) {
      this.name = name
      this.age = age
    }
  }

  class UserCRUD implements BaseCRUD<User> {
    data: User[] = []

    // 添加一个数据项, 返回生成的id
    add (user: User): number{   
      const id = Date.now()
      user.id = id
      this.data.push(user)

      return id
    } 
    
    // 得到指定id对应的数据项
    getById(id: number): User {
      return this.data.find(user => user.id===id)
    } 
  }

  const userCRUD = new UserCRUD()
  const id = userCRUD.add(new User('A', 12))
  userCRUD.add(new User('B', 13))
  const user = userCRUD.getById(id)
  console.log(user)
  console.log(userCRUD.data)


  /* class ProductCRUD {
    data: Product[] = []

    add (user: Product): void {

    }

    getById (id: number): Product {
      return Product对象
    }
  } */